package com.leetcode.studyplan.algorithm.basis;


/**
 * 可参考数学中，前提：nums[-1]=nums[nums.length]=-∞，根据极值的定义，在局部单调递增，即可以找到二分法做此题的思路。
 * 题目中的意思，应该是一定会有峰值。如果没有峰值，应该返回什么值，题目中应该要做说明
 */
public class L_162_FindPeakElement {

    public static void main(String[] args) {
        L_162_FindPeakElement element = new L_162_FindPeakElement();
//        int[] nums = {1,2,3,1};
//        int[] nums = {1,2,1,3,5,6,4};
        int[] nums = {1};
        System.out.println(element.findPeakElement(nums));
    }

    public int findPeakElement(int[] nums) {

        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {

            int mid = (left + right) / 2;
            int midL = mid - 1;
            int midR = mid + 1;

            boolean res = isPeak(nums, midL, mid, midR);
            if (res) {
                return mid;
            }

            if (midR < nums.length && nums[mid] < nums[midR]) {
                left = mid + 1;
            } else if (midL >= 0 && nums[mid] < nums[midL]) {
                right = mid - 1;
            }

        }

        return 0;
    }

    private boolean isPeak(int[] nums, int midL, int mid, int midR) {

        if (midL < 0) { // 最左边的元素

            if (midR >= nums.length || nums[mid] > nums[midR]) {
                return true;
            }

        } else {
            if (midR >= nums.length) { // 最右边的元素
                if (nums[mid] > nums[midL]) {
                    return true;
                }
            } else { // 中间的元素
                if (nums[mid] > nums[midL] && nums[mid] > nums[midR]) {
                    return true;
                }
            }
        }

        return false;
    }


}
